2018.2 MOCTFcrackme2 WriteUp
1. 随意看看
查壳
VC++6.0写的,不放图了
OD分析
字符串搜索
先到Your get the flag, but it ….看看
分析跳转
这个地方有个跳转,也就是判断你输的flag对不对的
但是这个跳转如果爆破是没什么用的,因为你并不能得出真正的flag
翻到上面
可以看到有一行
10<1<>;?8:%w!##&#q./,x(,((
这其实是接下来要与你输入的字符做比较
在jnz判断前面的test下断点,从这段开头的push往下执行,执行到输入字符后,这时候返回来看看寄存器窗口,会发现
ECX里是要比较的字符串,EDX里是你刚刚输入的,而且被加密了,因此我们接下来要做的就是分析这个加密的原理
IDA分析
伪代码分析
分析算法当然是IDA的F5大法了
找到刚刚那一段,F5
这就是整个算法了
可以看到,我们输入字符串之后,它把每一位都代入sub_4010CD,转换后得出新的组合
于是我们应该跟进去
再跟
好了,这就是它的加密算法核心了,先看看这个dword是什么
就是数字6
算法分析
所以这回就彻底清楚了
我们把字符串输入进去,它把每一位都和这个dword做了异或,而dword从6开始累加,最后输出的v7与它原来的做比较
所以依靠这个思路写一个c++程序,不要在意头文件。。。
c++
|
这里直接带入
10<1<>;?8:%w!##&#q./,x(,((
就可以,因为两次异或抵消,所以加密前的带入得出加密后的,加密后
的带入也就能得到加密前的
77486572655f30735f666c4167
不过怎么看也不像是flag,况且给提示了,所以应该是被其他加密方式加密了吧
Flag
26位肯定不是MD5,长的像的只有16进制了,尝试后发现16进制转文本就是真正的flag
就是下面这个了
wHere_0s_flAg
轻松+200